#ifndef _PM_DEBUG_H
#define _PM_DEBUG_H

#include "pm_config.h"
/*
 * Copyright (c) 2011-2015 yanggq.young@allwinnertech.com
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published by
 * the Free Software Foundation.
 */
 



//#define GET_CYCLE_CNT
#define IO_MEASURE
extern volatile int print_flag;

enum counter_type_e{
	I_CACHE_MISS = 0X01,
	I_TLB_MISS = 0X02,
	D_CACHE_MISS = 0X03,
	D_TLB_MISS = 0X05,
};

typedef union{
    __u32 dwval;
    struct __r_pio_pad_hold
    {
	__u32   data_rd:8;        //bit0-7,  data read reg.
	__u32   data_wr:8;        //bit8-15, data write reg.
	__u32   reg_sel:2;        //bit16-17,  data reg sel.
	__u32   reserved:13;      //bit18-30, reserved
	__u32   wr_pulse:1;       //bit31, write ops pulse:
	// first write 1, delay 1us, then write 0, 
	// the dataWrite will be writen to RTC domain. 
    } bits; 
}__r_prcm_pio_pad_hold;

void set_event_counter(enum counter_type_e type);
int get_event_counter(enum counter_type_e type);
void init_event_counter (__u32 do_reset, __u32 enable_divider);

/*
 * Check at compile time that something is of a particular type.
 * Always evaluates to 1 so you may use it easily in comparisons.
 */
#define typecheck(type,x) \
({	type __dummy; \
	typeof(x) __dummy2; \
	(void)(&__dummy == &__dummy2); \
	1; \
})

/*
 * if return true, means a is after b;
 */	
#define counter_after(a,b) \
(typecheck(__u32, a) && \
typecheck(__u32, b) && \
((__s32)(b) - (__s32)(a) < 0))
#define counter_before(a,b) counter_after(b,a)

#define counter_after_eq(a,b) \
(typecheck(__u32, a) && \
typecheck(__u32, b) && \
((__s32)(a) - (__s32)(b) >= 0))
#define counter_before_eq(a,b) counter_after_eq(b,a)


void busy_waiting(void);
/*
 * notice: when resume, boot0 need to clear the flag, 
 * in case the data in dram be destoryed result in the system is re-resume in cycle.
*/
void mem_status_init(void);
void mem_status_init_nommu(void);
void mem_status_clear(void);
void mem_status_exit(void);
void save_mem_flag(void);
void clear_mem_flag(void);
void save_mem_status(volatile __u32 val);
void save_mem_status_nommu(volatile __u32 val);
void save_cpux_mem_status_nommu(volatile __u32 val);

__u32 get_mem_status(void);
void show_mem_status(void);
__u32 save_sun5i_mem_status_nommu(volatile __u32 val);
__u32 save_sun5i_mem_status(volatile __u32 val);


/*for secure debug, add by huangshr
 *data: 2014-10-20
 */
void pm_secure_mem_status_init(void);
void pm_secure_mem_status_init_nommu(void);
void pm_secure_mem_status_clear(void);
void pm_secure_mem_status_exit(void);
void show_pm_secure_mem_status(void);
void save_pm_secure_mem_status(volatile __u32 val);
void save_pm_secure_mem_status_nommu(volatile __u32 val);
__u32 get_pm_secure_mem_status(void);



void io_init(void);
void io_init_high(void);
void io_init_low(void);
void io_high(int num);

#endif /*_PM_DEBUG_H*/

